package stream;

import java8.Employee;
import org.junit.Test;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Stream;

//StreamAPI
public class TestStreamAPI2 {
	
	private List<Employee> emps = Arrays.asList(
			new Employee(102, "李四", 59, 6666.66),
			new Employee(101, "张三", 18, 9999.99),
			new Employee(103, "王五", 28, 3333.33),
			new Employee(104, "赵六", 8, 7777.77),
			new Employee(104, "赵六", 8, 7777.77),
			new Employee(104, "赵六", 8, 7777.77),
			new Employee(105, "田七", 38, 5555.55)
	);
	//映射
	@Test
	public void test01(){
		//map:接受一个函数,将流中每一个元素转换成其他形式,或者提取其中一部分信息,形成一个新的元素
		emps.stream().map(e->e.getName()).forEach(System.out::println);
		//将String的list转为大写输出
		List<String> list = Arrays.asList("aa","bb","cc","dd","ee","ff","gg");
		list.stream().map(String::toUpperCase).forEach(System.out::println);
		
		//将String转换为char输出   TestStreamAPI2::filterCharacter:返回含有char的流
		//即map返回一个流,流中的每个元素又是一个流
		Stream<Stream<Character>> map = list.stream().map(TestStreamAPI2::filterCharacter);
		//双重循环输出字符
		map.forEach((sm)->{
			//每个含有字符的流再循环
			sm.forEach(System.out::println);
		});
		
		//可以使用flatMap直接完成     flatMap——接收一个函数作为参数，将流中的每个值都换成另一个流，然后把所有流连接成一个流
		list.stream().flatMap(TestStreamAPI2::filterCharacter).forEach(System.out::println);
	}
	
	//将字符串转换成单个字符,返回含有字符的流
	public static Stream<Character> filterCharacter(String str){
		List<Character> list=new ArrayList<>();
		for (Character character : str.toCharArray()) {
			list.add(character);
		}
		return list.stream();
	}
	
	
	@Test
	public void test02(){
		//自然排序
		emps.stream().map(e->e.getName()).sorted().forEach(System.out::println);
		
		//定制排序
		emps.stream().sorted((x,y)->{
			if(x.getAge()==y.getAge()){//年龄相等按名字排序
				return x.getName().compareTo(y.getName());
			}else{
				return Integer.compare(x.getAge(), y.getAge());
			}
		}).forEach(System.out::println);
	}

}
